/**
 * 设置页面脚本
 */

class SettingsManager {
    constructor() {
        this.form = document.getElementById('settings-form');
        this.resetBtn = document.getElementById('reset-btn');
        this.saveBtn = document.getElementById('save-btn');
        
        // 默认设置
        this.defaultSettings = {
            语言: 'zh',
            主题: 'system',
            摘要: {
                默认比例: 0.3,
                算法: 'extractive',
                关键词数量: 10
            },
            文档: {
                支持格式: ['txt', 'pdf', 'docx', 'md', 'html'],
                最大大小: 10485760 // 10MB
            },
            历史: {
                自动保存: true,
                最大数量: 100
            },
            web: {
                端口: 8080,
                主机: '127.0.0.1'
            }
        };
        
        this.init();
    }
    
    // 初始化
    async init() {
        // 加载当前设置
        await this.loadSettings();
        
        // 绑定表单事件
        if (this.form) {
            this.form.addEventListener('submit', (e) => {
                e.preventDefault();
                this.saveSettings();
            });
        }
        
        // 绑定重置按钮事件
        if (this.resetBtn) {
            this.resetBtn.addEventListener('click', () => this.resetSettings());
        }
        
        // 绑定范围输入值显示
        const defaultRatio = document.getElementById('default-ratio');
        const defaultRatioValue = document.getElementById('default-ratio-value');
        if (defaultRatio && defaultRatioValue) {
            defaultRatio.addEventListener('input', () => {
                defaultRatioValue.textContent = `${(defaultRatio.value * 100).toFixed(0)}%`;
            });
        }
        
        // 监听语言切换
        const languageSelect = document.getElementById('language');
        if (languageSelect) {
            languageSelect.addEventListener('change', () => {
                if (confirm('切换语言需要刷新页面，确定要切换吗？')) {
                    this.quickSave({ 语言: languageSelect.value })
                        .then(() => window.location.reload());
                } else {
                    // 恢复选择
                    languageSelect.value = document.documentElement.lang;
                }
            });
        }
        
        // 监听主题切换
        const themeSelect = document.getElementById('theme');
        if (themeSelect) {
            themeSelect.addEventListener('change', () => {
                themeManager.setTheme(themeSelect.value);
            });
        }
    }
    
    // 加载设置
    async loadSettings() {
        try {
            loadingManager.show();
            
            const settings = await apiService.getSettings();
            this.updateFormValues(settings);
            
        } catch (error) {
            notificationSystem.show('加载设置失败: ' + error.message, 'error');
            // 使用默认设置
            this.updateFormValues(this.defaultSettings);
        } finally {
            loadingManager.hide();
        }
    }
    
    // 更新表单值
    updateFormValues(settings) {
        if (!this.form) return;
        
        // 基本设置
        this.setFormValue('language', settings.语言);
        this.setFormValue('theme', settings.主题);
        
        // 摘要设置
        this.setFormValue('default-ratio', settings.摘要?.默认比例);
        this.setFormValue('algorithm', settings.摘要?.算法);
        this.setFormValue('keywords-count', settings.摘要?.关键词数量);
        
        // 文档设置
        const formatCheckboxes = document.querySelectorAll('input[name="文档.支持格式"]');
        formatCheckboxes.forEach(checkbox => {
            checkbox.checked = settings.文档?.支持格式?.includes(checkbox.value);
        });
        
        this.setFormValue('max-file-size', (settings.文档?.最大大小 || 0) / 1048576); // 转换为MB
        
        // 历史记录设置
        this.setFormValue('auto-save', settings.历史?.自动保存);
        this.setFormValue('history-limit', settings.历史?.最大数量);
        
        // Web服务器设置
        this.setFormValue('port', settings.web?.端口);
        this.setFormValue('host', settings.web?.主机);
        
        // 更新范围输入值显示
        const defaultRatioValue = document.getElementById('default-ratio-value');
        if (defaultRatioValue) {
            defaultRatioValue.textContent = `${(settings.摘要?.默认比例 * 100).toFixed(0)}%`;
        }
    }
    
    // 设置表单值
    setFormValue(id, value) {
        const element = document.getElementById(id);
        if (element) {
            if (element.type === 'checkbox') {
                element.checked = value;
            } else {
                element.value = value;
            }
        }
    }
    
    // 获取表单值
    getFormValues() {
        const formData = new FormData(this.form);
        const settings = {
            语言: formData.get('语言'),
            主题: formData.get('主题'),
            摘要: {
                默认比例: parseFloat(formData.get('摘要.默认比例')),
                算法: formData.get('摘要.算法'),
                关键词数量: parseInt(formData.get('摘要.关键词数量'))
            },
            文档: {
                支持格式: formData.getAll('文档.支持格式'),
                最大大小: parseInt(formData.get('文档.最大大小')) * 1048576 // 转换为字节
            },
            历史: {
                自动保存: formData.get('历史.自动保存') === 'on',
                最大数量: parseInt(formData.get('历史.最大数量'))
            },
            web: {
                端口: parseInt(formData.get('web.端口')),
                主机: formData.get('web.主机')
            }
        };
        
        return settings;
    }
    
    // 保存设置
    async saveSettings() {
        try {
            loadingManager.show();
            
            const settings = this.getFormValues();
            await apiService.saveSettings(settings);
            
            notificationSystem.show('设置已保存', 'success');
            
        } catch (error) {
            notificationSystem.show('保存设置失败: ' + error.message, 'error');
        } finally {
            loadingManager.hide();
        }
    }
    
    // 快速保存单个设置
    async quickSave(setting) {
        try {
            loadingManager.show();
            
            const currentSettings = await apiService.getSettings();
            const newSettings = { ...currentSettings, ...setting };
            await apiService.saveSettings(newSettings);
            
        } catch (error) {
            notificationSystem.show('保存设置失败: ' + error.message, 'error');
            throw error;
        } finally {
            loadingManager.hide();
        }
    }
    
    // 重置设置
    async resetSettings() {
        if (!confirm('确定要重置所有设置吗？此操作不可恢复！')) {
            return;
        }
        
        try {
            loadingManager.show();
            
            await apiService.saveSettings(this.defaultSettings);
            this.updateFormValues(this.defaultSettings);
            
            notificationSystem.show('设置已重置为默认值', 'success');
            
        } catch (error) {
            notificationSystem.show('重置设置失败: ' + error.message, 'error');
        } finally {
            loadingManager.hide();
        }
    }
    
    // 验证设置
    validateSettings(settings) {
        // 验证摘要设置
        if (settings.摘要) {
            if (settings.摘要.默认比例 < 0.1 || settings.摘要.默认比例 > 0.9) {
                throw new Error('摘要比例必须在10%到90%之间');
            }
            if (settings.摘要.关键词数量 < 3 || settings.摘要.关键词数量 > 20) {
                throw new Error('关键词数量必须在3到20之间');
            }
        }
        
        // 验证文档设置
        if (settings.文档) {
            if (settings.文档.最大大小 < 1048576 || settings.文档.最大大小 > 104857600) {
                throw new Error('文件大小限制必须在1MB到100MB之间');
            }
        }
        
        // 验证历史记录设置
        if (settings.历史) {
            if (settings.历史.最大数量 < 10 || settings.历史.最大数量 > 1000) {
                throw new Error('历史记录数量必须在10到1000之间');
            }
        }
        
        // 验证Web服务器设置
        if (settings.web) {
            if (settings.web.端口 < 1024 || settings.web.端口 > 65535) {
                throw new Error('端口号必须在1024到65535之间');
            }
            if (!settings.web.主机) {
                throw new Error('主机地址不能为空');
            }
        }
        
        return true;
    }
}

// 初始化设置管理器
document.addEventListener('DOMContentLoaded', () => {
    new SettingsManager();
});